<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>21.什么是对象的属性特征</title>
</head>

<body>
  <script>
    const user = {
      name: "向军",
      age: 18
    }
    // 增加属性
    user.lesson = "js";
    // 删除属性
    delete user.age;
    console.log(user); //{name: '向军', lesson: 'js'}

    //遍历属性
    let array = ['后盾人', 'hdcms'];
    console.log(array); /**  0:"后盾人"1:"hdcms"length:2[[Prototype]]:Array(0)  
    */
    for (const [k, v] of Object.entries(array)) {
      console.log(k, v);
    }
    // 0 后盾人 ,1 hdcms lenght 属性没有被打印
    //JS 中可以对属性的访问特性进行控制。

    //使用 Object.getOwnPropertyDescriptor查看对象属性的描述。
    let desc = Object.getOwnPropertyDescriptor(user, 'name');
    console.log(JSON.stringify(desc, null, 2)) //{ "value": "向军", "writable": true, "enumerable": true, "configurable": true }

    //使用 Object.getOwnPropertyDescriptors查看对象所有属性的描述
    // 获得user的全部两个属性
    let descAll= Object.getOwnPropertyDescriptors(user);
    console.log(JSON.stringify(descAll, null, 2)) 
    //{ "name": { "value": "向军", "writable": true, "enumerable": true, "configurable": true }, 
    //"lesson": { "value": "js", "writable": true, "enumerable": true, "configurable": true } }

    /**
    属性包括以下四种特性
  
    特性          	说明                                    	             默认值      
    configurable	能否使用 delete、能否需改属性特性、或能否修改访问器属性       	true     
    enumerable  	对象属性是否可通过 for-in 循环，或 Object.keys() 读取	       true     
    writable    	对象属性是否可修改                             	           true     
    value       	对象属性的默认值                              	           undefined
    */
  </script>
</body>

</html>